diff options
| author | Martin Kagamino Lehoux <martin@lehoux.net> | 2026-07-27 19:53:11 +0200 |
|---|---|---|
| committer | Martin Kagamino Lehoux <martin@lehoux.net> | 2026-07-27 19:53:11 +0200 |
| commit | e075698891d653330b5d5d0f80c2c3495aee6262 (patch) | |
| tree | f0b04b3d003fb49f820d1da86b811a9bd05b9a56 /src/routes/grocery/[id]/+page.server.ts | |
| parent | 2ded7d512470b2e9faabf2f61a0a97eef95a6f89 (diff) | |
feat: product references + grocery detail page
- references table (brand, price, unit, quality_score) with FK to groceries
- /grocery/[id] page for managing references per item
- Unit dropdown (€/kg, €/L, €/u) defaulting to €/kg
- → link on all items navigates to detail page
- Delete item moved from catalog to detail page
Diffstat (limited to 'src/routes/grocery/[id]/+page.server.ts')
| -rw-r--r-- | src/routes/grocery/[id]/+page.server.ts | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/src/routes/grocery/[id]/+page.server.ts b/src/routes/grocery/[id]/+page.server.ts new file mode 100644 index 0000000..88aa137 --- /dev/null +++ b/src/routes/grocery/[id]/+page.server.ts @@ -0,0 +1,71 @@ +import { error, fail, redirect } from '@sveltejs/kit'; +import { db } from '$lib/server/db'; +import { groceries, categories, references } from '$lib/server/db/schema'; +import { eq } from 'drizzle-orm'; +import type { Actions, PageServerLoad } from './$types'; + +export const load: PageServerLoad = async ({ params }) => { + const id = Number(params.id); + + const [item] = await db.select().from(groceries).where(eq(groceries.id, id)); + if (!item) throw error(404, 'Item not found'); + + const [cat] = item.categoryId + ? await db + .select() + .from(categories) + .where(eq(categories.id, item.categoryId)) + : [null]; + + const refs = await db + .select() + .from(references) + .where(eq(references.groceryId, id)); + + return { + item: { + ...item, + categoryName: cat?.name ?? null, + }, + references: refs, + }; +}; + +export const actions: Actions = { + add: async ({ request, params }) => { + const data = await request.formData(); + const brand = data.get('brand')?.toString().trim(); + const price = data.get('price')?.toString().trim(); + const unit = data.get('unit')?.toString().trim(); + const qualityScore = data.get('quality_score')?.toString().trim(); + + if (!brand) { + return fail(400, { error: 'Brand is required' }); + } + + await db.insert(references).values({ + groceryId: Number(params.id), + brand, + price: price ? Number(price) : null, + unit: unit || null, + qualityScore: qualityScore ? Number(qualityScore) : null, + }); + + return { success: true }; + }, + + delete: async ({ request }) => { + const data = await request.formData(); + const id = Number(data.get('id')); + + await db.delete(references).where(eq(references.id, id)); + + return { success: true }; + }, + + deleteItem: async ({ params }) => { + await db.delete(groceries).where(eq(groceries.id, Number(params.id))); + + throw redirect(303, '/'); + }, +}; |
